পাইথন প্যাকেজ ব্যবস্থাপনার জন্য setup.py এবং pyproject.toml এর একটি গভীর তুলনা, যেখানে সেরা অনুশীলন, মাইগ্রেশন কৌশল এবং আধুনিক সরঞ্জামগুলি কভার করা হয়েছে।
পাইথন প্যাকেজ স্ট্রাকচার: Setup.py বনাম Pyproject.toml - একটি বিস্তারিত নির্দেশিকা
বছরের পর বছর ধরে, the setup.py ফাইলটি পাইথন প্যাকেজ ব্যবস্থাপনার মূল ভিত্তি ছিল। তবে, পরিস্থিতি পরিবর্তিত হয়েছে, এবং pyproject.toml একটি আধুনিক বিকল্প হিসাবে আবির্ভূত হয়েছে। এই বিস্তারিত নির্দেশিকা এই দুটি পদ্ধতির মধ্যে পার্থক্যগুলি অন্বেষণ করে, আপনাকে আপনার প্রকল্পের জন্য কোনটি সঠিক তা বুঝতে এবং কীভাবে আপনার পাইথন প্যাকেজগুলি কার্যকরভাবে পরিচালনা করতে হয় তা শিখতে সহায়তা করবে।
মৌলিক বিষয়গুলি বোঝা
একটি পাইথন প্যাকেজ কি?
একটি পাইথন প্যাকেজ হলো আপনার পাইথন কোড সংগঠিত ও বিতরণ করার একটি উপায়। এটি আপনাকে সম্পর্কিত মডিউলগুলিকে একটি ডিরেক্টরি হায়ারার্কিতে একত্রিত করার সুবিধা দেয়, যা আপনার কোডকে আরও মডুলার, পুনরায় ব্যবহারযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। অন্যদের সাথে আপনার কোড ভাগ করে নেওয়া এবং আপনার প্রকল্পগুলিতে নির্ভরতা পরিচালনা করার জন্য প্যাকেজগুলি অপরিহার্য।
প্যাকেজ মেটাডেটার ভূমিকা
প্যাকেজ মেটাডেটা আপনার প্যাকেজ সম্পর্কে প্রয়োজনীয় তথ্য সরবরাহ করে, যেমন এর নাম, সংস্করণ, লেখক, নির্ভরতা এবং এন্ট্রি পয়েন্ট। এই মেটাডেটা pip এর মতো প্যাকেজ ম্যানেজারদের দ্বারা আপনার প্যাকেজগুলি ইনস্টল, আপগ্রেড এবং পরিচালনা করতে ব্যবহৃত হয়। ঐতিহাসিকভাবে, setup.py ছিল এই মেটাডেটা সংজ্ঞায়িত করার প্রধান উপায়।
Setup.py: ঐতিহ্যবাহী পদ্ধতি
Setup.py কি?
setup.py হলো একটি পাইথন স্ক্রিপ্ট যা setuptools লাইব্রেরি ব্যবহার করে আপনার প্যাকেজের কাঠামো এবং মেটাডেটা সংজ্ঞায়িত করে। এটি একটি গতিশীলভাবে কার্যকরযোগ্য ফাইল, অর্থাৎ এটি প্যাকেজ কনফিগার করার জন্য পাইথন কোড চালায়।
Setup.py এর প্রধান উপাদানসমূহ
একটি সাধারণ setup.py ফাইলে নিম্নলিখিত উপাদানগুলি অন্তর্ভুক্ত থাকে:
- প্যাকেজের নাম: আপনার প্যাকেজের নাম (যেমন,
my_package)। - সংস্করণ: আপনার প্যাকেজের সংস্করণ নম্বর (যেমন,
1.0.0)। - লেখক এবং রক্ষণাবেক্ষণকারীর তথ্য: প্যাকেজের লেখক এবং রক্ষণাবেক্ষণকারী সম্পর্কে বিস্তারিত।
- নির্ভরতা: অন্যান্য প্যাকেজের একটি তালিকা যার উপর আপনার প্যাকেজ নির্ভর করে (যেমন,
requests >= 2.20.0)। - এন্ট্রি পয়েন্ট: আপনার প্যাকেজে কমান্ড-লাইন স্ক্রিপ্ট বা অন্যান্য এন্ট্রি পয়েন্টগুলির সংজ্ঞা।
- প্যাকেজ ডেটা: নন-কোড ফাইল (যেমন, কনফিগারেশন ফাইল, ডেটা ফাইল) যা প্যাকেজে অন্তর্ভুক্ত করা উচিত।
Setup.py এর উদাহরণ
```python from setuptools import setup, find_packages setup( name='my_package', version='1.0.0', author='John Doe', author_email='john.doe@example.com', description='A simple Python package', packages=find_packages(), install_requires=[ 'requests >= 2.20.0', ], entry_points={ 'console_scripts': [ 'my_script = my_package.module:main', ], }, classifiers=[ 'Programming Language :: Python :: 3', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', ], ) ```Setup.py এর সুবিধা
- পরিচিতি: এটি ঐতিহ্যবাহী এবং সুপরিচিত পদ্ধতি, তাই অনেক ডেভেলপার ইতিমধ্যেই এটির সাথে পরিচিত।
- নমনীয়তা: যেহেতু এটি একটি পাইথন স্ক্রিপ্ট, এটি উচ্চ মাত্রার নমনীয়তা প্রদান করে। আপনি প্রয়োজন অনুযায়ী জটিল লজিক সম্পাদন করতে এবং বিল্ড প্রক্রিয়া কাস্টমাইজ করতে পারেন।
- সম্প্রসারণযোগ্যতা: সেটআপটুলস (Setuptools) বৈশিষ্ট্যগুলির একটি সমৃদ্ধ সেট সরবরাহ করে এবং কাস্টম কমান্ড এবং এক্সটেনশনগুলির সাথে প্রসারিত করা যেতে পারে।
Setup.py এর অসুবিধা
- ডাইনামিক এক্সিকিউশন:
setup.pyএর ডাইনামিক প্রকৃতি একটি নিরাপত্তা ঝুঁকি হতে পারে, কারণ এটি বিল্ড প্রক্রিয়ার সময় নির্বিচারে কোড কার্যকর করে। - অন্তর্নিহিত নির্ভরতা:
setup.pyপ্রায়শই অন্তর্নিহিত নির্ভরতার উপর নির্ভর করে, যেমন সেটআপটুলস (setuptools) নিজেই, যা অসামঞ্জস্যতা এবং ত্রুটির কারণ হতে পারে। - জটিলতা: জটিল প্রকল্পগুলির জন্য,
setup.pyবড় এবং রক্ষণাবেক্ষণ করা কঠিন হতে পারে। - সীমাবদ্ধ ঘোষণাযোগ্য কনফিগারেশন: প্যাকেজ মেটাডেটার বেশিরভাগই ঘোষণাযোগ্য উপায়ে না হয়ে অপরিহার্যভাবে সংজ্ঞায়িত করা হয়, যা এটিকে যুক্তিযুক্ত করা কঠিন করে তোলে।
Pyproject.toml: আধুনিক বিকল্প
Pyproject.toml কি?
pyproject.toml হলো একটি কনফিগারেশন ফাইল যা TOML (Tom's Obvious, Minimal Language) ফরম্যাট ব্যবহার করে আপনার প্যাকেজের বিল্ড সিস্টেম এবং মেটাডেটা সংজ্ঞায়িত করে। এটি একটি ঘোষণামূলক পদ্ধতি, যার অর্থ আপনি কী অর্জন করতে চান তা নির্দিষ্ট করেন, কীভাবে অর্জন করবেন তা নয়।
Pyproject.toml এর প্রধান বিভাগসমূহ
A typicalpyproject.toml file includes the following sections:
[build-system]: ব্যবহৃত বিল্ড সিস্টেম সংজ্ঞায়িত করে (যেমন,setuptools,poetry,flit)।[project]: প্রকল্পের মেটাডেটা ধারণ করে, যেমন এর নাম, সংস্করণ, বর্ণনা, লেখক এবং নির্ভরতা।[tool.poetry]বা[tool.flit]: টুল-নির্দিষ্ট কনফিগারেশনগুলির জন্য বিভাগ (যেমন, পোয়েট্রি, ফ্লিত)।
Pyproject.toml এর উদাহরণ (সেটআপটুলস সহ)
```toml [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my_package" version = "1.0.0" description = "A simple Python package" authors = [ { name = "John Doe", email = "john.doe@example.com" } ] dependencies = [ "requests >= 2.20.0", ] [project.scripts] my_script = "my_package.module:main" [project.optional-dependencies] dev = [ "pytest", "flake8", ] [project.classifiers] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] [project.urls] homepage = "https://example.com" repository = "https://github.com/example/my_package" ```Pyproject.toml এর উদাহরণ (পোয়েট্রি সহ)
```toml [tool.poetry] name = "my_package" version = "1.0.0" description = "A simple Python package" authors = ["John DoePyproject.toml এর সুবিধা
- ঘোষণামূলক কনফিগারেশন:
pyproject.tomlআপনার প্যাকেজ মেটাডেটা সংজ্ঞায়িত করার একটি ঘোষণামূলক উপায় প্রদান করে, যা বোঝা এবং রক্ষণাবেক্ষণ করা সহজ করে তোলে। - মানসম্মত বিল্ড সিস্টেম: এটি ব্যবহারের জন্য বিল্ড সিস্টেম নির্দিষ্ট করে, বিভিন্ন পরিবেশে সামঞ্জস্যপূর্ণ বিল্ড নিশ্চিত করে।
- উন্নত নির্ভরতা ব্যবস্থাপনা: পোয়েট্রি এবং পিপেনভ (Pipenv) এর মতো সরঞ্জামগুলি
pyproject.tomlএর সাথে নির্বিঘ্নে একত্রিত হয়ে শক্তিশালী নির্ভরতা ব্যবস্থাপনা বৈশিষ্ট্য সরবরাহ করে। - হ্রাসকৃত নিরাপত্তা ঝুঁকি: যেহেতু এটি একটি স্ট্যাটিক কনফিগারেশন ফাইল, এটি বিল্ড প্রক্রিয়ার সময় গতিশীলভাবে কোড কার্যকর করার সাথে সম্পর্কিত নিরাপত্তা ঝুঁকিগুলি দূর করে।
- আধুনিক সরঞ্জামগুলির সাথে ইন্টিগ্রেশন:
pyproject.tomlহল পোয়েট্রি, পিপেনভ এবং ফ্লিত এর মতো আধুনিক পাইথন প্যাকেজিং সরঞ্জামগুলির জন্য একটি মান।
Pyproject.toml এর অসুবিধা
- শেখার বক্ররেখা: ডেভেলপারদের একটি নতুন সিনট্যাক্স (TOML) এবং প্যাকেজ ব্যবস্থাপনা সম্পর্কে একটি নতুন ধারণা শিখতে হতে পারে।
- সীমাবদ্ধ নমনীয়তা: এটি অত্যন্ত কাস্টমাইজড বিল্ড প্রক্রিয়াগুলির জন্য উপযুক্ত নাও হতে পারে যার জন্য জটিল লজিক প্রয়োজন।
- সরঞ্জাম নির্ভরতা: আপনাকে একটি নির্দিষ্ট বিল্ড সিস্টেম (যেমন, সেটআপটুলস, পোয়েট্রি, ফ্লিত) বেছে নিতে হবে এবং এটি কীভাবে ব্যবহার করতে হয় তা শিখতে হবে।
Setup.py এবং Pyproject.toml এর তুলনা
এখানে setup.py এবং pyproject.toml এর মধ্যে প্রধান পার্থক্যগুলির একটি সারণী দেওয়া হলো:
| বৈশিষ্ট্য | Setup.py | Pyproject.toml |
|---|---|---|
| কনফিগারেশন স্টাইল | ইম্পারেটিভ (পাইথন কোড) | ডেক্লারেটিভ (TOML) |
| বিল্ড সিস্টেম | অন্তর্নিহিত (সেটআপটুলস) | সুস্পষ্ট ([build-system] এ নির্দিষ্ট) |
| নিরাপত্তা | সম্ভাব্য কম সুরক্ষিত (ডাইনামিক এক্সিকিউশন) | বেশি সুরক্ষিত (স্ট্যাটিক কনফিগারেশন) |
| নির্ভরতা ব্যবস্থাপনা | মৌলিক (install_requires) |
উন্নত (পোয়েট্রি, পিপেনভ এর সাথে ইন্টিগ্রেশন) |
| সরঞ্জাম | ঐতিহ্যবাহী (সেটআপটুলস) | আধুনিক (পোয়েট্রি, পিপেনভ, ফ্লিত) |
| নমনীয়তা | উচ্চ | মধ্যম |
| জটিলতা | জটিল প্রকল্পের জন্য উচ্চ হতে পারে | সাধারণত কম |
মাইগ্রেশন কৌশল: Setup.py থেকে Pyproject.toml
setup.py থেকে pyproject.toml এ মাইগ্রেট করা কঠিন মনে হতে পারে, কিন্তু দীর্ঘমেয়াদী রক্ষণাবেক্ষণ এবং ধারাবাহিকতার জন্য এটি একটি মূল্যবান বিনিয়োগ। এখানে কয়েকটি কৌশল রয়েছে যা আপনি ব্যবহার করতে পারেন:
1. একটি মিনিমাল Pyproject.toml দিয়ে শুরু করুন
একটি মৌলিক pyproject.toml ফাইল তৈরি করুন যা বিল্ড সিস্টেম নির্দিষ্ট করে এবং তারপর ধীরে ধীরে setup.py থেকে pyproject.toml এ মেটাডেটা স্থানান্তরিত করুন।
2. Pyproject.toml এর সাথে সেটআপটুলস ব্যবহার করুন
আপনার বিল্ড সিস্টেম হিসাবে সেটআপটুলস ব্যবহার করা চালিয়ে যান, তবে প্রকল্পের মেটাডেটা pyproject.toml এ সংজ্ঞায়িত করুন। এটি আপনাকে pyproject.toml এর সুবিধাগুলি ব্যবহার করতে এবং একই সাথে একটি পরিচিত সরঞ্জাম ব্যবহার করতে দেয়।
3. পোয়েট্রির মতো আধুনিক টুলে মাইগ্রেট করুন
পোয়েট্রি বা পিপেনভ (Pipenv) এর মতো একটি আধুনিক টুলে স্থানান্তরের কথা বিবেচনা করুন। এই সরঞ্জামগুলি ব্যাপক নির্ভরতা ব্যবস্থাপনা বৈশিষ্ট্য সরবরাহ করে এবং pyproject.toml এর সাথে নির্বিঘ্নে একত্রিত হয়।
উদাহরণ: পোয়েট্রিতে মাইগ্রেট করা
- পোয়েট্রি ইনস্টল করুন:
pip install poetry - আপনার প্রকল্পে পোয়েট্রি ইনিশিয়ালাইজ করুন:
poetry init(এটি আপনাকে একটিpyproject.tomlফাইল তৈরি করার প্রক্রিয়াতে সহায়তা করবে) - আপনার নির্ভরতা যোগ করুন:
poetry add requests(বা অন্য যেকোনো নির্ভরতা) - আপনার প্যাকেজ তৈরি করুন:
poetry build
4. স্বয়ংক্রিয় মাইগ্রেশনের জন্য সরঞ্জাম ব্যবহার করুন
কিছু সরঞ্জাম মাইগ্রেশন প্রক্রিয়া স্বয়ংক্রিয় করতে সাহায্য করতে পারে। উদাহরণস্বরূপ, আপনি আপনার setup.py ফাইলকে একটি pyproject.toml ফাইলে রূপান্তর করতে সরঞ্জাম ব্যবহার করতে পারেন।
পাইথন প্যাকেজ ব্যবস্থাপনার জন্য সেরা অনুশীলন
1. একটি ভার্চুয়াল এনভায়রনমেন্ট ব্যবহার করুন
আপনার প্রকল্পের নির্ভরতাগুলি সিস্টেম-ব্যাপী পাইথন ইনস্টলেশন থেকে বিচ্ছিন্ন করতে সর্বদা একটি ভার্চুয়াল এনভায়রনমেন্ট ব্যবহার করুন। এটি দ্বন্দ্ব প্রতিরোধ করে এবং নিশ্চিত করে যে আপনার প্রকল্পের সঠিক নির্ভরতা রয়েছে।
venv ব্যবহার করে উদাহরণ:
conda ব্যবহার করে উদাহরণ:
2. নির্ভরতা সঠিকভাবে নির্দিষ্ট করুন
আপনার নির্ভরতাগুলির সামঞ্জস্যপূর্ণ সংস্করণগুলি নির্দিষ্ট করতে সংস্করণ সীমাবদ্ধতা ব্যবহার করুন। এটি অসঙ্গতিপূর্ণ লাইব্রেরি আপডেটের কারণে সৃষ্ট অপ্রত্যাশিত আচরণ প্রতিরোধ করে। আপনার নির্ভরতা পরিচালনার জন্য pip-tools এর মতো সরঞ্জাম ব্যবহার করুন।
নির্ভরতা নির্দিষ্টকরণের উদাহরণ:
``` requests >= 2.20.0, < 3.0.0 ```3. একটি সুসংগত বিল্ড সিস্টেম ব্যবহার করুন
একটি বিল্ড সিস্টেম (যেমন, সেটআপটুলস, পোয়েট্রি, ফ্লিত) বেছে নিন এবং এটির সাথে লেগে থাকুন। এটি বিভিন্ন পরিবেশে সামঞ্জস্যপূর্ণ বিল্ড নিশ্চিত করে এবং প্যাকেজিং প্রক্রিয়াকে সরল করে।
4. আপনার প্যাকেজের ডকুমেন্টেশন তৈরি করুন
আপনার প্যাকেজের জন্য স্পষ্ট এবং সংক্ষিপ্ত ডকুমেন্টেশন লিখুন। এটি ব্যবহারকারীদের আপনার প্যাকেজ কীভাবে ব্যবহার করতে হয় তা বুঝতে সাহায্য করে এবং অন্যদের জন্য আপনার প্রকল্পে অবদান রাখা সহজ করে তোলে। আপনার কোড থেকে ডকুমেন্টেশন তৈরি করতে স্পিনক্স (Sphinx) এর মতো সরঞ্জাম ব্যবহার করুন।
5. কন্টিনিউয়াস ইন্টিগ্রেশন (CI) ব্যবহার করুন
আপনার কোডে পরিবর্তন করা হলে স্বয়ংক্রিয়ভাবে আপনার প্যাকেজ তৈরি, পরীক্ষা এবং স্থাপন করার জন্য একটি CI সিস্টেম (যেমন, গিটহাব অ্যাকশনস, ট্র্যাভিস CI, গিটল্যাব CI) সেট আপ করুন। এটি নিশ্চিত করতে সাহায্য করে যে আপনার প্যাকেজ সর্বদা কার্যকরী অবস্থায় রয়েছে।
গিটহাব অ্যাকশনস কনফিগারেশনের উদাহরণ:
```yaml name: Python Package on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python 3.9 uses: actions/setup-python@v4 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install poetry poetry install - name: Lint with flake8 run: | poetry run flake8 . - name: Test with pytest run: | poetry run pytest ```6. আপনার প্যাকেজ PyPI তে প্রকাশ করুন
আপনার প্যাকেজটি পাইথন প্যাকেজ ইনডেক্স (PyPI) এ প্রকাশ করে বিশ্বের সাথে শেয়ার করুন। এটি অন্যদের জন্য আপনার প্যাকেজ ইনস্টল করা এবং ব্যবহার করা সহজ করে তোলে।
PyPI তে প্রকাশ করার পদক্ষেপ:
- PyPI এবং TestPyPI তে একটি অ্যাকাউন্ট নিবন্ধন করুন।
twineইনস্টল করুন:pip install twine।- আপনার প্যাকেজ তৈরি করুন:
poetry buildঅথবাpython setup.py sdist bdist_wheel। - আপনার প্যাকেজ TestPyPI তে আপলোড করুন:
twine upload --repository testpypi dist/*। - আপনার প্যাকেজ PyPI তে আপলোড করুন:
twine upload dist/*।
বাস্তব-বিশ্বের উদাহরণ
আসুন দেখি কিভাবে কিছু জনপ্রিয় পাইথন প্রকল্প pyproject.toml ব্যবহার করছে:
- পোয়েট্রি (Poetry): নিজের প্যাকেজ ব্যবস্থাপনার জন্য
pyproject.tomlব্যবহার করে। - ব্ল্যাক (Black): এই আপসহীন কোড ফরম্যাটারটিও
pyproject.tomlব্যবহার করে। - ফাস্টএপিআই (FastAPI): পাইথন দিয়ে API তৈরির জন্য একটি আধুনিক, দ্রুত (উচ্চ-পারফরম্যান্স) ওয়েব ফ্রেমওয়ার্কও এটি ব্যবহার করে।
উপসংহার
pyproject.toml পাইথন প্যাকেজ ব্যবস্থাপনার আধুনিক মানকে প্রতিনিধিত্ব করে, যা আপনার প্যাকেজ মেটাডেটা সংজ্ঞায়িত করতে এবং নির্ভরতা পরিচালনা করার জন্য একটি ঘোষণামূলক ও সুরক্ষিত উপায় সরবরাহ করে। যদিও setup.py আমাদের ভালোভাবে সেবা দিয়েছে, pyproject.toml এ মাইগ্রেট করা দীর্ঘমেয়াদী রক্ষণাবেক্ষণ, ধারাবাহিকতা এবং আধুনিক সরঞ্জামগুলির সাথে ইন্টিগ্রেশনের জন্য একটি মূল্যবান বিনিয়োগ। সেরা অনুশীলনগুলি অবলম্বন করে এবং সঠিক সরঞ্জামগুলি ব্যবহার করে, আপনি আপনার পাইথন প্যাকেজিং কর্মপ্রবাহকে সুগম করতে এবং উচ্চ-মানের, পুনরায় ব্যবহারযোগ্য প্যাকেজ তৈরি করতে পারেন।